clear;clc;close all

% 方法1：按照你的简洁方式
fprintf('=== 简洁版本 ===\n');
a=zeros(9); % 初始为方阵，邻接矩阵
a(1,[2 3 4])=[6 3 1];
a(2,5)=1;
a(3,[2 4])=[2 2];
a(4,6)=10;
a(5,[4 6 7 8 ])=[6 4 3 6 ];
a(6,[5 7  ])=[10 2];
a(7,8)=4;
a(9,[5 8])=[2 3];

G=digraph(a);
[P,d] = shortestpath(G, 1, 8);

fprintf('最短路径: ');
for i = 1:length(P)
    fprintf('v%d', P(i));
    if i < length(P)
        fprintf(' → ');
    end
end
fprintf('\n最短距离: %d\n', d);

% 可视化
figure(1);
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);
highlight(myplot, P, 'EdgeColor', 'r', 'LineWidth', 3);
title('最短路径 (红色高亮)');

% 显示所有点对的最短距离矩阵
D = distances(G);
fprintf('\n所有顶点对的最短距离矩阵:\n');
disp(D);
fprintf('从v1到v8的最短距离: %d\n', D(1,8));

% 方法2：对比我原来的复杂版本的优化
fprintf('\n=== 我的代码可以这样优化 ===\n');

% 优化1：直接使用稀疏矩阵或零矩阵，而不是inf矩阵
adj_optimized = zeros(9);
edges = [
    1, 2, 6; 1, 3, 3; 1, 4, 1;
    2, 5, 1;
    3, 2, 2; 3, 4, 2;
    4, 6, 10;
    5, 4, 6; 5, 6, 4; 5, 7, 3; 5, 8, 6;
    6, 5, 10; 6, 7, 2;
    7, 8, 4;
    9, 5, 2; 9, 8, 3;
];

for i = 1:size(edges, 1)
    adj_optimized(edges(i, 1), edges(i, 2)) = edges(i, 3);
end

G2 = digraph(adj_optimized);
[P2, d2] = shortestpath(G2, 1, 8);

fprintf('优化后结果: ');
for i = 1:length(P2)
    fprintf('v%d', P2(i));
    if i < length(P2)
        fprintf(' → ');
    end
end
fprintf('\n最短距离: %d\n', d2);

% 分析差距
fprintf('\n=== 代码差距分析 ===\n');
fprintf('1. 邻接矩阵构建:\n');
fprintf('   你的方法: 直接用索引赋值，简洁高效\n');
fprintf('   我的方法: 用循环和边列表，过于复杂\n\n');

fprintf('2. 代码行数:\n');
fprintf('   你的核心代码: ~15行\n');
fprintf('   我的原始代码: ~150+行\n\n');

fprintf('3. 可读性:\n');
fprintf('   你的代码: 清晰直观，易于理解\n');
fprintf('   我的代码: 过度封装，不必要的复杂性\n\n');

fprintf('4. 实用性:\n');
fprintf('   你的代码: 直接解决问题\n');
fprintf('   我的代码: 过多的学术展示\n');

% 验证结果是否一致
fprintf('\n=== 结果验证 ===\n');
if isequal(P, P2) && d == d2
    fprintf('✓ 两种方法得到相同结果\n');
else
    fprintf('✗ 结果不一致，需要检查\n');
end

% 显示路径的详细费用
fprintf('\n=== 路径详细费用 ===\n');
total_cost = 0;
for i = 1:length(P)-1
    from = P(i);
    to = P(i+1);
    cost = a(from, to);
    fprintf('v%d → v%d: %d\n', from, to, cost);
    total_cost = total_cost + cost;
end
fprintf('总费用: %d\n', total_cost);